package com.appspot.eusms.notifications;

import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.util.Log;

import org.whispersystems.textsecure.crypto.MasterSecret;

import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;

public class NotificationState {

    private final LinkedList<NotificationItem> notifications = new LinkedList<NotificationItem>();
    private final Set<Long> threads = new HashSet<Long>();

    private int notificationCount = 0;

    public void addNotification(NotificationItem item) {
        notifications.addFirst(item);
        threads.add(item.getThreadId());
        notificationCount++;
    }

    public boolean hasMultipleThreads() {
        return threads.size() > 1;
    }

    public int getMessageCount() {
        return notificationCount;
    }

    public List<NotificationItem> getNotifications() {
        return notifications;
    }

    public Bitmap getContactPhoto() {
        return notifications.get(0).getIndividualRecipient().getContactPhoto();
    }

    public PendingIntent getMarkAsReadIntent(Context context, MasterSecret masterSecret) {
        long[] threadArray = new long[threads.size()];
        int index = 0;

        for (long thread : threads) {
            Log.w("NotificationState", "Added thread: " + thread);
            threadArray[index++] = thread;
        }

        Intent intent = new Intent(MarkReadReceiver.CLEAR_ACTION);
        intent.putExtra("thread_ids", threadArray);
        intent.putExtra("master_secret", masterSecret);
        intent.setPackage(context.getPackageName());

        // XXX : This is an Android bug.  If we don't pull off the extra
        // once before handing off the PendingIntent, the array will be
        // truncated to one element when the PendingIntent fires.  Thanks guys!
        Log.w("NotificationState", "Pending array off intent length: " +
                intent.getLongArrayExtra("thread_ids").length);

        return PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    }
}
